#ifndef _SCENE_H_
#define _SCENE_H_
#include "Global.h"
#include "Object.h"
#include <vector>
#include <string>
#include <set>
#include "shop.h"
#include "LoginSignUp.h"
#include <unistd.h>
class Shop;
class TreasureBox;
class Player;
class Monster;
class Scene
{
public:
    // 获取唯一实例的静态方法
    static Scene& getInstance(Player &p, Shop &a, Scene &sc) {
        static Scene instance(p, a, sc);
        return instance;
    }

    // 删除拷贝构造函数和赋值操作符
    Scene(const Scene&) = delete;
    Scene& operator=(const Scene&) = delete;

    void Clear();
    // void InitMonsters();
    void InitShop();
    // void InitTreasureBoxes();
    void show();
    Monster* IsPosEqual();
    bool ISPosEqual();
    TreasureBox* TIsPosEqual();
    void Fight(Monster *m);
    void GetTreasureBox(TreasureBox *t);
    void Player2Monster(Monster *m);
    void Player2Monster(Monster *m,int rata,int mutiple);
    void Monster2Player(Monster *m);
    bool Escape();

    // void RefreshMonster(Monster *m);
    // 删除指定的怪物
    void RemoveMonster(Monster* m);
    // void RemoveTreasureBoxes(TreasureBox *t);
    // 检查坐标 (x, y) 是否与宝箱数组中的任何宝箱重叠
    // bool isOverlap(std::vector<std::shared_ptr<TreasureBox>> &treasureBoxes, int x, int y);
    // void RemoveTreasureBox(int index);
    // int GetTreasureBoxIndex(TreasureBox* t);
    
    // void saveMonsters();
    // std::vector<Monster> loadMonsters();
    // bool Exits();
private:
    // 私有构造函数
    Scene(Player &p, Shop &a, Scene &sc);
    std::string Map[MapSize][MapSize];
    std::vector<Shop> shops;
    // std::vector<std::shared_ptr<Monster>> monsters;
    std::vector<std::shared_ptr<TreasureBox>> treasureBoxes;
    std::set<std::pair<int, int>> usedCoordinates;
    std::pair<int, int> generateUniqueCoordinates();
    Scene &sc;
    Player &p;
    Shop &a;
    Monster *m;
    TreasureBox *t;
};

// class shop;
// class GameLauncher
// {
// public:
//     void start()
//     {
//         Scren e;
//         e.show();
//         sleep(2);
//         system("clear");
//         // Player p();
//         Player p(0,0,global_username,"👨",100,4,1);
//         Shop a(0,2,"商店","🏬",p);
//         Scene& s = Scene::getInstance(p,a,s);
    
        
//         if(!p.exist())
//         {
//             p.SetX(0);
//             p.SetY(0);
//             p.SetName(global_username);
//             p.SetSymbol("👨");
//             p.SetHP(100);
//             p.SetAttack(4);
//             p.Setdefends(1);
//         }
//         else
//         {
//             p.LoadPlayerAttributesFromFile();
//         }
        
        
//         // 使用单例模式获取 Scene 实例
        
//         p.GetBag().LoadFromFile();
//         // 获取 items 的大小
//         size_t numItems = p.Box->getItems().size();
//         if(numItems <= 0)
//         {
//             p.Box->Generate();
//         }
//         while(1)
//         {   
//             s.show();
//             p.show();
//             p.Move();
//             Monster *m = s.IsPosEqual();
//             if(m)
//             {
//                 s.Fight(m);
//             }
//             TreasureBox *t = s.TIsPosEqual();
//             if(t)
//             {
//                 s.GetTreasureBox(t);
//             }
//             //
//             system("clear");//清屏
//             int b = s.ISPosEqual();
//             if(b)
//             {
//                 a.show();
//             }
//             if(numItems <= 0)
//             {
//                 p.Box->Generate();
//             }
//         }
//      }
// };

class GameFacade 
{
private:
    Player player;
    Shop shop;
    Scene& scene;

public:
    GameFacade()
        : player(0, 0, global_username, "👨", 100, 4, 1), shop(0, 2, "商店", "🏬", player), scene(Scene::getInstance(player, shop,scene)) {}

    void start()
    {
        initialize();
        gameLoop();
    }

private:
    void initialize() 
    {
        sleep(2);
        system("clear");

        if (player.exist()) 
        {
            player.LoadPlayerAttributesFromFile();
        }

        player.GetBag().LoadFromFile();
        if (player.Box->getItems().size() <= 0) {
            player.Box->Generate();
        }
    }

    void gameLoop() 
    {
        while (true) 
        {
            scene.show();
            player.show();
            player.Move();
            handleInteractions();
            system("clear");
        }
    }

    void handleInteractions() 
    {
        Monster* monster = scene.IsPosEqual();
        TreasureBox* treasureBox = scene.TIsPosEqual();

        if (monster) 
        {   
            if (treasureBox)
            {
                printf("你遇到了一个怪物，它似乎在守护着什么...\n");
                sleep(2);
            }
            int x3 = monster->GetX();
            int y3 = monster->GetY();
            // 遇到怪物，进行战斗
            scene.Fight(monster);
            if(monster->GetX() == x3 & monster->GetY() == y3)
            {

            }
            else if(treasureBox)
            {
                scene.GetTreasureBox(treasureBox);
            }
        } 
        else if (treasureBox) 
        {
            // 只有宝箱，没有怪物
            scene.GetTreasureBox(treasureBox);
        }
        else if (scene.ISPosEqual()) 
        {
            shop.show();
        }
        // 检查并生成新的物品（如果需要）
        if (player.Box->getItems().size() <= 3) 
        {
            player.Box->Generate();
        }
     }
};

class GameLauncher
{
public:
    void start() 
    {
        GameFacade gameFacade;
        gameFacade.start();
    }
};



#endif